
/* *
* Promise.finally是 JavaScript 中用于处理Promise的一个方法。
* 它接收一个回调函数作为参数，这个回调函数会在Promise被fulfilled（成功）或者rejected（失败）后执行，无论Promise最终的状态如何。
* 它就像是一个 “兜底” 操作，主要用于执行一些无论成功还是失败都需要进行的清理工作，比如关闭数据库连接、清除定时器、隐藏加载动画等操作。
* finally方法返回的Promise会根据之前Promise的状态和finally回调函数中的操作来决定最终状态。
* 如果finally回调函数中没有抛出异常并且之前的Promise是fulfilled状态，那么最终返回的Promise也是fulfilled状态，并且值为之前Promise的成功值。
* 如果finally回调函数中没有抛出异常并且之前的Promise是rejected状态，那么最终返回的Promise也是rejected状态，并且原因是之前Promise的失败原因。
* 如果finally回调函数中抛出了异常，那么不管之前Promise的状态如何，最终返回的Promise都是rejected状态，并且原因是finally回调函数中抛出的异常
* */
Promise.prototype.myFinally2 = function (callback) {
    return this.then(
        //? 第一个参数 resolve调用的
        //? 如果  Promise  对象被成功处理，则会首先执行  callback()  回调函数，然后将其返回的值作为新的Promise对象(也就是Promise.resolve干的事)的值继续链式调用
        //? then(() => value)就是无论传什么参数进去都返回value 原封不动了相当于
        //? callback可能是异步 所以这个用resolve包裹，then等待其完成再返回原值
        (value) => Promise.resolve(callback()).then(() => value),
        //? 第二个参数 reject调用的
        //? 如果 Promise 对象被拒绝，则会首先执行 callback() 回调函数，然后将其返回的错误对象 throw 出来，以便后续的 catch() 方法继续处理
        (error) =>
            Promise.resolve(callback()).then(() => {
                throw error;
            })
    );
}
function asyncFunc() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('s!');
        }, 1000);
    });
}
//
// asyncFunc()
//     .myFinally2(() => { //? finally收不到任何参数
//         console.log('finally has been executed');
//         return 123 //? return不起作用 在里面就已经return了
//     })
//     //? 然后这里再调用then时 会用到上面finally的结果，而finally的结果就是里面回调函数执行后return的不改变value的Promise
//     .then((value) => {
//         console.log(value);  // 输出: "Success!"
//     })
//     .catch((error) => {
//         console.error(error);
//     })


Promise.resolve(3)
    .myFinally2(() => { //? finally收不到任何参数
        console.log('finally has been executed');
        return 123 //? return不起作用 在里面就已经return了
    })
    //? 然后这里再调用then时 会用到上面finally的结果，而finally的结果就是里面回调函数执行后return的不改变value的Promise
    .then((value) => {
        console.log(value);  // 输出: "Success!"
    })
    .catch((error) => {
        console.error(error);
    })
Promise.resolve(3)
    .finally(() => { //? finally收不到任何参数
        console.log('finally has been executed');
        return 123 //? return不起作用 在里面就已经return了
    })
    //? 然后这里再调用then时 会用到上面finally的结果，而finally的结果就是里面回调函数执行后return的不改变value的Promise
    .then((value) => {
        console.log(value);  // 输出: "Success!"
    })
    .catch((error) => {
        console.error(error);
    })
